A/D変換の制御法
A/D変換機能をチェックしてみよう!
PIC16F87XシリーズのA/D変換機能について
PIC16F87xシリーズは、10ビットのA/D変換モジュールが内蔵されています。分解能が1024段階となっていますので、かなり応用範囲を広げることが出来ます。A/D変換が8ビットの従来のチップでは、256段階しかなかったので、測定するには少々分解能不足なところがありました。1024の分解能があるということは、1Vの電圧を測るときには1mV単位で計測できるということです。PICでは、A/D変換をするために、まずアナログ信号を一旦内部のコンデンサに蓄えます。その後、参照となる一定の電圧を加算して比較しながら計測するという逐次変換方式であるため、A/D変換を正確に行うためには、蓄積するまでの時間(アクィジション時間)と計測する時間の両方を確保することが必要になります。従来の8ビットPICの場合と比較して、クロック20MHzの時でこの時間がどれぐらいかというと、
蓄積時間+計測時間=
12μsec+1.6μsec×9.5 =最小27.2μsec(8ビットのPIC)
20μsec+1.6μsec×12 =最小39.2μsec(10ビットのPIC)
となっています。これ以上の高速でのA/D変換動作は物理的にできないということになります。つまり、1秒間に約3万6千回(8ビット)、約2万5千回(10ビット)程度の計測回数です。詳細については、(5)A/D変換のシーケンスについての説明をご覧ください。
A/D変換の制御用レジスタ
A/D変換関連の制御用レジスタとして、ADCON0,ADCON1,ADRESの3種類のレジスタがあります。まず、これらの内容と機能を把握する必要があります。
(A)ADCON0レジスタ(Bank0)
A/D変換クロックなどの指定とチャンネル指定などの設定を行います。ADCON0レジスタの構成は図1のようになっていて、大部分のA/D変換に関する設定ができるようになっています。その機能について、表1に示します。
![]() |
図1. ADCON0レジスタの構成 |
bit | 名称 | 機能 | データ | 意味 | |
7,6 | ADCSx (ADCS1,ADSC0) |
A/D変換 クロック指定ビット |
00 | Fosc/2 | |
01 | Fosc/8 | ||||
10 | Fosc/32 | ||||
11 | Frc(内部RC発振) | ||||
5,4,3 | CHSx (CHS2,CHS1,CHS0) |
アナログチャネル 指定ビット |
000 | CH0(RA0) | |
001 | CH1(RA1) | ||||
010 | CH2(RA2) | ||||
011 | CH3(RA3) | ||||
100 | CH4(RA5) | ||||
101 | CH5(RE0) (注1) | ||||
110 | CH6(RE1) (注1) | ||||
111 | CH7(RE2) (注1) | ||||
2 | GO/DONE | A/D 変換 ステータスビット |
1 | ADON=1の時、このビットをセットすると、 A/D変換が開始される。 |
|
0 | ADON=1の時、A/D 変換が終了 すると自動的にクリアされる |
||||
1 | − | なし | − | 「0」とリードされる | |
0 | ADON | A/D ON ビット | 1 | A/D変換器モジュールを動作 | |
0 | A/D変換器モジュールはオフ |
(注1)これらのチャネルは28 ピンデバイス(PIC16F873、876)にはありません。
(B)ADCON1レジスタ(Bank1)
ADCON1レジスタの構成は図2のようになっていて、ポートピンの機能を構成します。ポートピンはアナログ入力(RA3
は電圧リファレンスとしても)またはディジタルI/O
として構成できます。
![]() |
図2. ADCON1レジスタの構成 |
ADCON1レジスタの各ビットにおける機能は、表2のようになっています。
bit | 名称 | 機能 | データ | 意味 | |
7 | ADFM | A/D 結果 フォーマットセレクト |
1 | 右詰 ADRESHの6MSbは「0 」とリードされる |
|
0 | 左詰 ADRESLの6LSbは「0 」とリードされる |
||||
6,5,4 | − | なし | − | 「0」とリードされる | |
3,2,1,0 | PCFGx (PCFG3〜PCFG0) |
A/D ポート構成コントロールビット | 表3.A/D ポートの設定表を参照 |
ADCON1レジスタの3〜0ビット(PCFGx)の設定内容は、表3のようになっています。
PCFGx | AN7 | AN6 | AN5 | AN4 | AN3 | AN2 | AN1 | AN0 | Vref+ | Vref− | |||
RE2 | RE1 | RE0 | RA5 | RA3 | RA2 | RA1 | RA0 | ||||||
0 | 0 | 0 | 0 | A | A | A | A | A | A | A | A | VDD | VSS |
0 | 0 | 0 | 1 | A | A | A | A | Vref+ | A | A | A | RA3 | VSS |
0 | 0 | 1 | 0 | D | D | D | A | A | A | A | A | VDD | VSS |
0 | 0 | 1 | 1 | D | D | D | A | Vref+ | A | A | A | RA3 | VSS |
0 | 1 | 0 | 0 | D | D | D | D | A | D | A | A | VDD | VSS |
0 | 1 | 0 | 1 | D | D | D | D | Vref+ | D | A | A | RA3 | VSS |
0 | 1 | 1 | 0 | D | D | D | D | D | D | D | D | VDD | VSS |
0 | 1 | 1 | 1 | D | D | D | D | D | D | D | D | VDD | VSS |
1 | 0 | 0 | 0 | A | A | A | A | Vref+ | Vref- | A | A | RA3 | RA2 |
1 | 0 | 0 | 1 | D | D | A | A | A | A | A | A | VDD | VSS |
1 | 0 | 1 | 0 | D | D | A | A | Vref+ | A | A | A | RA3 | VSS |
1 | 0 | 1 | 1 | D | D | A | A | Vref+ | Vref- | A | A | RA3 | RA2 |
1 | 1 | 0 | 0 | D | D | D | A | Vref+ | Vref- | A | A | RA3 | RA2 |
1 | 1 | 0 | 1 | D | D | D | D | Vref+ | Vref- | A | A | RA3 | RA2 |
1 | 1 | 1 | 0 | D | D | D | D | D | D | D | A | VDD | VSS |
1 | 1 | 1 | 1 | D | D | D | D | Vref+ | Vref- | D | A | RA3 | RA2 |
(注)「A」はアナログ入力,「D」はディジタル入出力,
「Vref+」,「Vref-」は基準電圧入力の上限と下限
リファレンス指定のない時は、電源電圧VDDとグランド電圧VSSが基準となる。
AN5〜AN7は28 ピンデバイス(PIC16F873、876)にはありません。
(C)ADRESレジスタ(Bank0)
ADRESHレジスタ(A/D結果Highレジスタ)、およびADRESLレジスタ(A/D結果Lowレジスタ)は、10
ビットのA/D 変換結果が入ります。A/D 変換が終了すると、結果がA/D
結果レジスタのペアにロードされ、GO/DONE ビット(ADCON0<2>)がクリアされて、A/D
割り込みフラグビットADIF がセットされます。
A/D変換のブロック構成
A/Dモジュールのブロック図を図3に示します。図3中の黄色のスイッチ構成部分ですが、ADCON0のアナログチャネル指定ビット(CHS0〜2)により、AN0〜AN7が選択できます。また、図3中の緑色や水色のスイッチ構成部分ですが、ADCON1のA/D
ポート構成コントロールビット(PCFG3〜0)により、基準電圧が選択されます。AN3「Vref+」およびAN2「Vref-」は、基準電圧入力の上限と下限と設定することもできますし、リファレンス指定のない時は、電源電圧VDDとグランド電圧VSSが基準となるように設定することもできます。
![]() |
図3. A/Dのブロック構成図 (Microchip社データシート参照) |
A/D変換の実行ステップ
A/D モジュール設定後は、変換開始前に選択したチャネルをアクィジションする必要があります。アナログ入力チャネルには、対応するTRIS
ビットを入力として選択しなければなりません。サンプル時間を決定するには、A/D
アクィジションの条件を参照してください。このアクィジション時間が経過した後にA/D
変換を開始できます。A/D変換を実行するには次のステップに従います。
A/D変換のシーケンスについて
図4に変換のシーケンスを示します。A/D変換後、または新しいA/D チャネルが選択された時にホールド用コンデンサの充電が始まります。アクィジション時間とは、A/D
モジュールのホールド用コンデンサが外部電圧レベルになるまでの充電時間です。この必要なアクィジション時間を待った後、GOビットがセットされたときにA/D変換が開始されます。A/D
変換が終了すると、結果がADRES レジスタにロードされます。その後ADIF ビットがセットされ、ホールド用コンデンサは選択チャネルで次の電圧のアクィジションを始めます。これら2
つの時間の合計がサンプリング時間です。
![]() |
図4. A/D変換のシーケンス |
アクィジション時間について
A/D 変換器が規定の精度に結果を出すには、ホールド用コンデンサ(CHOLD)を入力チャネルの電圧までフル充電されなければいけません。アナログ入力モデルを図5に示します。ソースインピーダンス(Rs)と内部サンプリングスイッチ(Rss)のインピーダンスはコンデンサCHOLD の充電に必要な時間に直接関係します。サンプリングスイッチ(Rss)のインピーダンスはデバイスの電圧(VDD
)により変化します(図6を参照)。
アナログソースの最大推奨インピーダンスはRS=10kΩです。インピーダンスが少なくなるほど、アクィジション時間も少なくなります。アナログ入力チャネルが選択(または、変更)された後は、変換を開始する前に、このアクィジションを行わなければなりません。
![]() |
|
図5. アナログ入力モデル(Microchip社データシート参照) | |
CPIN | :入力容量 |
VT | :スレッショルド電圧 |
I leakage | :各種接合によるピンのリーク電流 |
RIC | :内部接続抵抗 |
SS | :サンプリングスイッチ |
CHOLD | :サンプル/ホールド容量(DAC から) |
![]() |
図6. Rss対VDD特性 (Microchip社データシート参照) |
最小アクィジション時間を計算するには、式(1)に示す公式で計算することができます。この公式は1/2LSBのエラーを使用する(A/D
は1024 ステップ)ことを想定しています。1/2LSBエラーはA/D
が規定の分解能を満たすために許された最大エラーです。
TACQ= Amplifier Settling Time+ Holding Capacitor Charging Time+ Temperature Coefficient = TAMP + TC + TCOFF = 2μs + TC + [(Temperature−25℃)×(0.05μs/℃)] ・・・式(1) ここで、 TC = −CHOLD× (RIC + RSS + RS)× ln(1/2047) 温度係数TCOFFは、温度>25 ℃のときのみ必要 (Microchip社データシート参照) |
(注1)リファレンス電圧(VREF)は、それ自身をキャンセルするので、 この式に影響を与えません。 (注2)ホールド用コンデンサ(CHOLD)は各変換後、放電させません。 (注3)アナログ信号源の推奨インピーダンスは10k Ω以下です。 これは、ピンのリーク仕様を満たすために必要です。 (注4)変換終了後、アクィジションが再開する前に2.0TAD の遅延が 終了しなければなりません。この時間中はホールド用コンデン サは選択されたA/D 入力チャネルに接続されません。 |
次に最小必要アクィジション時間 TACQ の計算例を示します。この計算は次のアプリケーションシステムの想定に基づいています。(Microchip社データシート参照)
CHOLD = 120 pF
Rs = 10 kΩ
Conversion Error ≦1/2 LSB
VDD = 5V →Rss = 7 kΩ(図6 のグラフ参照)
Temperature = 50℃(system max.)
VHOLD =0V @time=0
これらの条件を公式(1)に代入すると、
TC = −CHOLD×(RIC + RSS + RS)× ln(1/2047)
= −120pF×(1kΩ + 7kΩ + 10kΩ)×
ln(0.0004885)
= −120pF×18kΩ×(-7.624)
= 16.47μs
よって、最小必要アクィジション時間は、
TACQ= 2μs + 16.47μs + [(50℃-25℃)×(0.05μs/℃)]
= 2μs + 16.47μs + 1.25μs
= 19.72μs
と求まります。
A/D 変換クロックの選択について
1 ビット当たりのA/D 変換時間はTAD として定義されます。A/D
変換は、10 ビット変換にでは最小12TAD が必要です。A/D
変換クロックのソースはソフトウエアで選択します。TAD
のオプションとして次のものがあります。
正しいA/D 変換のために、必ずA/D 変換クロック(TAD)を、最小TAD
時間の1.6μs以上にします。
A/D変換用クロックの指定方法について表4に示しますが、システムクロックの周波数により、指定できる範囲が限られていますので、注意が必要です。それは、A/D変換クロックの最小値が1.6μsとなっているため、この値より小さくなる設定はできません。また、変換時間が長い設定については別のクロック設定をお勧めします。内部RC発振回路を使用するFrc指定の場合は、システムクロックには影響されず、2〜6μsの周波数になりますが、正確なクロック周波数ではなくなります。
設定 | ADCS1,ADCS0 | システムクロック | |||
20MHz | 10MHz | 4MHz | 1MHz | ||
Fosc/2 | 00 | 0.1μs | 0.2μs | 0.5μs | 2.0μs |
Fosc/8 | 01 | 0.4μs | 0.8μs | 2.0μs | 8.0μs |
Fosc/32 | 10 | 1.6μs | 3.2μs | 8.0μs | 32μs |
Frc | 11 | 2〜6μs |
(注1)RC ソースの標準TAD 時間は、4μsです。 (注2)赤い枠の値は、A/D変換クロックの最小値に 違反しています。(推奨範囲外) (注3)青い枠の値は、変換時間を短くするため、 別のクロック設定を勧めます。(推奨範囲外) (注4)デバイスの周波数が1 MHz より速い場合、 RC のA/D 変換ソースはスリープでのみの使用を推奨します。 |
アナログポートピンの構成
ADCON1 およびTRIS レジスタはA/D ポートピンの動作を制御します。アナログ入力として希望するポートピンには、それに対応するTRIS
ビットのセット(入力)が必要です。TRIS ビットがクリア(出力)された場合、ディジタル出力レベル(VOH
またはVOL)が変換されます。CHS2〜0 ビットおよびTRIS
ビットの状態に関係なくA/D 変換は行われます。
アナログ入力チャンネルとして構成されるピンをリードすると0
(Low レベル)とリードされます。ディジタル入力として構成されるピンはアナログ入力と変換します。ディジタル入力のアナログレベルは変換精度に影響を与えません。ディジタル入力(AN7〜AN0
を含む)と設定されたピンにアナログレベルが入力されると、入力バッファがデバイスの仕様外の電流を消費することがあります。
A/D変換の実行方法
A/D 変換の実行方法を示します。アナログピンはアナログ入力として構成されています。アナログリファレンス(VREF)はデバイスのVDD
とVSS です。A/D 割り込みは発生可、A/D 変換クロックはFRC
、A/D結果は左詰されます。変換はRA0/AN0 ピン(チャネル0
)で実行されます。
変換中にGO/DONE ビットをクリアすると、変換を中断することになります。中断した場合は、A/D
結果レジスタは更新されません。つまり、ADRESH,ADRESL レジスタは最後に完了した変換値(またはADRESH,ADRESLレジスタに最後にライトされた値)を保持します。A/D変換の中断後は、次のアクィジションを開始する前に2TAD
のウェイトが必要です。この2TAD のウェイト後、選択されたチャネルでのアクィジションが自動的に開始されます。
A/D変換の実行例 | |
BSF STATUS, RP0 BCF STATUS, RP1 CLRF ADCON1 BSF PIE1, ADIE BCF STATUS, RP0 MOVLW B’11000001’ MOVWF ADCON0 BCF PIR1, ADIF BSF INTCON, PEIE BSF INTCON, GIE |
; Bank 1 を選択する ; ; A/D 入力を構成する ; A/D 割り込みを発生可にする ; Bank 0 を選択する ; RC クロック、A/D はオン、チャネル 0を選択 ; ; A/D 割り込みフラグビットをクリアする ; 周辺割り込みを発生させる ; すべての割り込みを発生させる |
; ; 選択した入力チャネルに必要なサンプリング時間が経過後、 ; 変換を開始します。 ; |
|
BSF ADCON0, GO : : |
; A/D 変換を開始する ; A/D 変換が完了すると、ADIF ビットがセットされ、 ; GO/DONE ビットがクリアされる。 |
図7に、A/D変換のTADサイクルを示します。GO ビットがセットされた後、1 回目のセグメントに最低でTCY 、最大でTAD です。
(注)GO/DONE ビットはA/D をオンにする命令と同じ命令ではセットできません。
![]() |
図7. A/D変換のTADサイクル |
A/D結果レジスタについて
ADRESH,ADRESL レジスタのペアは、A/D 変換の終了時に10
ビットのA/D 結果がロードされるロケーションです。このレジスタのペアは16
ビット幅です。A/D モジュールは、16 ビット結果レジスタの10
ビットの結果に左または右詰できます。A/D フォーマットセレクトビット(ADFM)は、この左詰または右詰を制御します。図8にA/D
結果の詰め方を示します。余分なビットには「0」がロードされます。A/D
結果がこれらのロケーションをオーバーライドしない(A/D
を使用しない)場合、これらのレジスタは汎用8
ビットレジスタとして使用できます。
![]() |
図8.A/D 結果の右/左詰め |
スリープ中のA/D 動作
A/D モジュールはスリープ中も動作できます。そのためには、A/D
クロックソースをRC(ADCS1,ADCS0=11)にセットする必要があります。RC
クロックソースが選択されると、A/D モジュールは1
命令サイクル待ってから変換を開始します。これにより、SLEEP
命令を実行して、変換によるディジタル変換ノイズを除去することができます。変換が終了すると、GO/DONE
ビットがクリアされて、結果がADRES レジスタにロードされます。A/D
割り込みが発生可の場合は、デバイスはスリープから起動します。A/D
割り込み発生が許可されていない場合は、ADON
ビットがセットされたままであっても、A/D モジュールはオフになります。A/D
クロックソースが別のクロックオプション(RC
以外)である場合、SLEEP 命令により変換は中断され、ADON
ビットがセットされたままであっても、A/D モジュールはオフになります。A/D
をオフにすることにより、A/D モジュールは最も消費電流の低い状態になります。
(注)A/D モジュールがスリープ中に動作するには、A/D
クロックソースをRC(ADCS1,ADCS0=11)に設定する必要があります。スリープ中に変換するには、GO/DONEビットをセットした後すぐにSLEEP
命令を実行します。
リセットの影響
デバイスリセットによりすべてのレジスタは強制的にリセット状態になります。これによりA/D
モジュールは強制的にオフになり、すべての変換が中止になります。ADRESH,ADRESL
レジスタの値はパワー・オン・リセットでは変更されません。ADRESH,ADRESL
レジスタはパワー・オン・リセット後はデータが不定です。
次へは、A/D変換の動作確認です。
![]() |
![]() |
![]() |